package eco2automotive.tasks;
import java.util.*;
import eco2automotive.port.ConnectionControl;
import eco2automotive.gui.InforAlert;
import eco2automotive.elmFilter.Filter;
import eco2automotive.gui.Layout_DTCs;
import eco2automotive.elmFilter.SpecialFormula;
import eco2automotive.lang.EN;
import eco2automotive.data.HashErrorCode;
import eco2automotive.data.ErrorCode;


public class Task_DTCs{
    ConnectionControl connControl;        
    Layout_DTCs LAYOUT_DTCs;    
    HashErrorCode HERRORCODES;
    public Task_DTCs(ConnectionControl connControl, Layout_DTCs LAYOUT_DTCs,HashErrorCode HERRORCODES)
    {       
        this.connControl=connControl;                 
        this.LAYOUT_DTCs=LAYOUT_DTCs;
        this.HERRORCODES=HERRORCODES;
        
    }
    
    public void run()
   {        
      
        new InforAlert("WAIT!",EN.QUICK_ACTIONS_QUERY_DTCS_KEYON,1).muestraAlerta();                                  
        LAYOUT_DTCs.updatePrgogress("Cheking......");
        connControl.TXData("0101");            //Comprobar sí MIL is Turn On        
        connControl.TXData("03");              //Esto me da el numero de errores        
        try{Thread.sleep(3000);}catch(Exception e){}                                            
        LAYOUT_DTCs.updatePrgogress("Finish!");            
        /*
         ENVIO 03 Y ESPERO A RECIBIR ALGO 3 SEGUNDOS
         */        
if (connControl.DATA_AVAILABLE()==false)
      {   //NO HE ENCONTRADO RESPUESTA         
      new InforAlert("#ERROR!",EN.QUICK_ACTIONS_QUERY_NO_RESPONSE,1).muestraAlerta();                            
        }
else{ //HAY DATOS DISPONIBLES                
         boolean found=false;
         int errors;            
         for(int i=0;i<=connControl.getFata().getLongitud();i++){  //FOR  --------------------------------------
            String data=connControl.getFata().extract().toString();  //Extraígo de la pila el dato
            System.out.println("PILA GETDATA "+i+" datos"+data);
            String str_p0101=new Filter().getDigest(data,"4101[0-9-A-Z]{8}");
            String str_p03=new Filter().getDigest(data,"43[0-9-A-Z]{12}");            
            errors=0;            
            if(str_p0101.length()==8){ //Sí he conseguido una trama de 8 digitos hex. 
                        str_p0101=str_p0101.substring(4,str_p0101.length());    //No 4101                   
                        errors=new SpecialFormula().pid_0101(str_p0101);        //Obtengo el número de errores                          
                       new InforAlert("#DTCs",EN.QUICK_ACTIONS_QUERY_DTCS_NUMOF_ERRORS+errors,2).muestraAlerta();                             
            }
            
           if(str_p03.length()==12) //Sí he conseguido una trama de 12 dígitos hex.
              str_p03=str_p03.substring(2,str_p03.length());          //No 43                                                        
             if(errors>0){                       
                       found=true;            
                       ArrayList array=new SpecialFormula().pid_03(str_p03);  //Obtengo un array con las fallas                         
                       for ( Iterator iterador = array.listIterator(); iterador.hasNext(); ) {
                            String code=(String) iterador.next();
                            ErrorCode error= new ErrorCode();                    
                            error=HERRORCODES.getErrorCode(code);
                                if(error==null)//Not Found.
                                    {
                                    this.LAYOUT_DTCs.showInfoError("\t\n Error Found: "+code+"\tUnknow");
                                    }
                                else{
                                    this.LAYOUT_DTCs.showInfoError("\t\n Error Found: "+code+"\t"+error.getDescription());
                                    }
                            }     
                    }
             else if(errors==0)            
                    {
                      this.LAYOUT_DTCs.showInfoError("\t\n No Data Trouble Codes Found. "+data);
                     }
       } //END FOR TRAMAS---------------------------------------------------
        }//END  ELSE       
                
   }
    
}
